Java 26일 코스 - Day 8: 메서드

Day 8: 메서드

메서드는 특정 작업을 수행하는 코드 블록입니다. 코드의 재사용성을 높이고, 프로그램을 논리적 단위로 분리하여 가독성을 향상시킵니다. Java에서는 모든 메서드가 클래스 안에 존재해야 합니다.

메서드 정의와 호출

메서드는 반환 타입, 이름, 매개변수, 본문으로 구성됩니다.

public class MethodBasic {
    // 매개변수 없고 반환값 없는 메서드
    static void greet() {
        System.out.println("안녕하세요!");
    }

    // 매개변수가 있는 메서드
    static void greetUser(String name) {
        System.out.println(name + "님, 환영합니다!");
    }

    // 반환값이 있는 메서드
    static int add(int a, int b) {
        return a + b;
    }

    // 여러 값 처리
    static double calculateAverage(int[] scores) {
        int sum = 0;
        for (int score : scores) {
            sum += score;
        }
        return (double) sum / scores.length;
    }

    public static void main(String[] args) {
        greet();
        greetUser("홍길동");

        int result = add(10, 20);
        System.out.println("합계: " + result);

        int[] scores = {85, 90, 78, 92, 88};
        double avg = calculateAverage(scores);
        System.out.println("평균: " + avg);
    }
}

매개변수 전달 방식

Java는 항상 값에 의한 전달(pass by value)을 사용합니다. 참조형의 경우 참조값(주소)이 복사됩니다.

public class ParameterPassing {
    // 기본형: 값이 복사됨 (원본 변경 안 됨)
    static void changeValue(int num) {
        num = 100;
        System.out.println("메서드 내부: " + num); // 100
    }

    // 참조형: 참조가 복사됨 (객체 내용 변경 가능)
    static void changeArray(int[] arr) {
        arr[0] = 999;
        System.out.println("메서드 내부: " + arr[0]); // 999
    }

    // 가변 인자 (varargs)
    static int sum(int... numbers) {
        int total = 0;
        for (int n : numbers) {
            total += n;
        }
        return total;
    }

    public static void main(String[] args) {
        // 기본형 전달
        int x = 10;
        changeValue(x);
        System.out.println("원본: " + x); // 10 (변경 안 됨)

        // 참조형 전달
        int[] arr = {1, 2, 3};
        changeArray(arr);
        System.out.println("원본: " + arr[0]); // 999 (변경됨!)

        // 가변 인자 호출
        System.out.println(sum(1, 2, 3));       // 6
        System.out.println(sum(10, 20, 30, 40)); // 100
        System.out.println(sum());               // 0
    }
}

메서드 오버로딩

같은 이름의 메서드를 매개변수 타입이나 개수를 다르게 하여 여러 개 정의할 수 있습니다.

public class MethodOverloading {
    // 정수 두 개 더하기
    static int add(int a, int b) {
        return a + b;
    }

    // 실수 두 개 더하기
    static double add(double a, double b) {
        return a + b;
    }

    // 세 개 더하기
    static int add(int a, int b, int c) {
        return a + b + c;
    }

    // 문자열 합치기
    static String add(String a, String b) {
        return a + b;
    }

    // 실용적인 예: 출력 메서드
    static void printInfo(String name) {
        System.out.println("이름: " + name);
    }

    static void printInfo(String name, int age) {
        System.out.println("이름: " + name + ", 나이: " + age);
    }

    static void printInfo(String name, int age, String city) {
        System.out.println("이름: " + name + ", 나이: " + age + ", 도시: " + city);
    }

    public static void main(String[] args) {
        System.out.println(add(1, 2));         // 3
        System.out.println(add(1.5, 2.5));     // 4.0
        System.out.println(add(1, 2, 3));      // 6
        System.out.println(add("Hello", " World")); // Hello World

        printInfo("홍길동");
        printInfo("홍길동", 25);
        printInfo("홍길동", 25, "서울");
    }
}

재귀 호출

메서드가 자기 자신을 호출하는 기법입니다. 반드시 종료 조건(base case)이 필요합니다.

public class RecursionExample {
    // 팩토리얼: n! = n * (n-1)!
    static long factorial(int n) {
        if (n <= 1) return 1; // 종료 조건
        return n * factorial(n - 1);
    }

    // 피보나치 수열: F(n) = F(n-1) + F(n-2)
    static int fibonacci(int n) {
        if (n <= 0) return 0;
        if (n == 1) return 1;
        return fibonacci(n - 1) + fibonacci(n - 2);
    }

    // 거듭제곱: base^exponent
    static long power(int base, int exponent) {
        if (exponent == 0) return 1;
        return base * power(base, exponent - 1);
    }

    public static void main(String[] args) {
        System.out.println("5! = " + factorial(5));   // 120
        System.out.println("10! = " + factorial(10)); // 3628800

        System.out.print("피보나치: ");
        for (int i = 0; i < 10; i++) {
            System.out.print(fibonacci(i) + " ");
        }
        System.out.println(); // 0 1 1 2 3 5 8 13 21 34

        System.out.println("2^10 = " + power(2, 10)); // 1024
    }
}

오늘의 연습문제

  1. 최대공약수(GCD) 계산: 두 정수의 최대공약수를 유클리드 알고리즘(재귀)으로 구하는 메서드를 작성하세요. 추가로 최소공배수(LCM)도 구하세요. (LCM = a * b / GCD)

  2. 문자열 유틸리티: 다음 메서드를 오버로딩으로 구현하세요. repeat(String str, int count) - 문자열을 count번 반복, repeat(char ch, int count) - 문자를 count번 반복, repeat(String str) - 기본 3번 반복.

  3. 배열 검색: 정수 배열에서 특정 값을 찾는 search 메서드를 두 가지 버전으로 만드세요. 하나는 선형 검색, 하나는 정렬된 배열에서 이진 검색(재귀)을 수행합니다.

이 글이 도움이 되었나요?